package com.bifang.module.file.core.biz.impl;

import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bifang.engine.assistant.core.annotation.ApiService;
import com.bifang.engine.assistant.core.annotation.OpApi;
import com.bifang.engine.assistant.core.annotation.SaveOplog;
import com.bifang.engine.assistant.core.enums.AuTypeEnum;
import com.bifang.engine.assistant.core.enums.BoolEnum;
import com.bifang.engine.assistant.core.enums.FuncTypeEnum;
import com.bifang.engine.assistant.core.exception.AppException;
import com.bifang.engine.assistant.core.utils.SessionUtil;
import com.bifang.engine.data.core.util.PagerUtil;
import com.bifang.module.file.common.vo.fileAppClass.FileAppClassBatchVO;
import com.bifang.module.file.common.vo.fileAppClass.FileAppClassKeyVO;
import com.bifang.module.file.common.vo.fileAppClass.FileAppClassQueryVO;
import com.bifang.module.file.common.vo.fileAppClass.FileAppClassVO;
import com.bifang.module.file.core.biz.FileAppClassIntegration;
import com.bifang.module.file.core.util.FileClearCacheUtil;
import com.bifang.module.file.dao.model.FileAppClass;
import com.bifang.module.file.dao.model.FileClass;
import com.bifang.module.file.dao.service.FileAppClassService;
import com.bifang.module.file.dao.service.FileClassService;
import com.bifang.module.system.core.dao.model.SysApplication;
import com.bifang.module.system.core.dao.service.SysApplicationService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * 文件应用分类授权管理业务实现类
 *
 * @author shun
 * @since 2023-03-16
 */
@ApiService(funcCode = "fileAppClass", title = "文件应用分类授权管理")
public class FileAppClassIntegrationImpl implements FileAppClassIntegration {
    private final static long year   = 31104000000L;

    @Autowired
    public FileAppClassService fileAppClassService;
    
    @Autowired
    public FileClassService fileClassService;

    @Autowired
    public SysApplicationService sysApplicationService;
    @Autowired
    private FileClearCacheUtil fileClearCacheUtil;

    @Override
    @OpApi(funcCode = "fileAppClass0001", title = "文件应用分类授权管理分页查询", funcType = FuncTypeEnum.query)
    public PageInfo<FileAppClassVO> getList(FileAppClassQueryVO vo) {
        // 开启分页
        if (vo.getPageNum() == null || vo.getPageSize() == null) {
            //如果不传入分页参数，默认最大取1000条
            vo.setPageNum(1);
            vo.setPageSize(1000);
        }
        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
        QueryWrapper<FileAppClass> queryWrapper=new QueryWrapper<>();
        if(!ObjectUtils.isEmpty(vo.getAppId())){
            queryWrapper.lambda().eq(FileAppClass::getAppId,vo.getAppId());
        }
        if(!StringUtils.isEmpty(vo.getFileClassCode())){
            queryWrapper.lambda().eq(FileAppClass::getFileClassCode,vo.getFileClassCode());
        }
        List<FileAppClass> list = fileAppClassService.list(queryWrapper);
        if (CollectionUtils.isEmpty(list)) {
            // 判断是否为空，为空则返回空参数
            return PagerUtil.createEmptyPagerInfo(vo.getPageNum(), vo.getPageSize());
        }
        // 不为空则获取分页结果
        PageInfo<FileAppClass> pageInfo = new PageInfo<>(list);
        // 返回参数需要通过common层的vo实体类，用该方法可以批量转换
        List<FileAppClassVO> resultList = Convert.toList(FileAppClassVO.class, pageInfo.getList());
        //处理文件分类中文名 以及转化过期时间
        for(FileAppClassVO fileAppClassVO:resultList){
            String fileClassCode = fileAppClassVO.getFileClassCode();
            FileClass fileClass = fileClassService.getById(fileClassCode);
            if(!ObjectUtils.isEmpty(fileClass)){
                fileAppClassVO.setFileClassTitle(fileClass.getClassTitle());
            }
            Date expireTime = fileAppClassVO.getExpireTime();
            if(!ObjectUtils.isEmpty(expireTime)){
//                Date date = new Date(expireTime);
//                fileAppClassVO.setExpireDate(date);
                fileAppClassVO.setExpireDate(expireTime);
            }
            //对应用名进行处理
            Long appId = fileAppClassVO.getAppId();
            SysApplication sysApplication = sysApplicationService.getById(appId);
            if(!ObjectUtils.isEmpty(sysApplication)){
                fileAppClassVO.setAppName(sysApplication.getAppName());
            }

        }
        // 转义数据字典值
        // dictHelper.valueToName(resultList, Arrays.asList(DemoDictEnum.values()));
        return PagerUtil.parsePagerVo(resultList, pageInfo);
    }

    @Override
    @OpApi(funcCode = "fileAppClass0002", title = "文件应用分类授权管理根据主键查询详情", funcType = FuncTypeEnum.query)
    public FileAppClassVO getById(FileAppClassKeyVO vo) {
        FileAppClass entity = fileAppClassService.getById(vo.getAppClassId());
        if (ObjectUtils.isEmpty(entity)) {
            throw new AppException("查询不到详细信息!");
        }
        FileAppClassVO result = Convert.convert(FileAppClassVO.class, entity);
        return result;
    }
    /** 保存前统一校验*/
    @Override
    @OpApi(funcCode = "fileAppClass0003", title = "文件应用分类授权管理保存前校验", funcType = FuncTypeEnum.other ,checkPrivilege = BoolEnum.FALSE)
    public void checkSave(FileAppClassVO vo) {
        //主键为空为新增校验
        if(vo.getFileClassCode()==null||("").equals(vo.getFileClassCode())){
            throw new AppException("文件分类编号不能为空");
        }
        if(vo.getAppId()==null){
            throw new AppException("应用id不能为空");
        }

        if(vo.getExpireTime()==null){
            throw new AppException("到期时间不能为空");
        }
        //主键不为空为修改校验
    }

    @Override
    @OpApi(funcCode = "fileAppClass0004", title = "文件应用分类授权管理新增", funcType = FuncTypeEnum.insert)
    @SaveOplog(
            operationType = "fileAppClass0004",
            operationName = "文件应用分类授权管理新增",
            dataType = "appClassId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public FileAppClassVO add(FileAppClassVO vo) {
        //保存前校验
        checkSave(vo);
        //保存数据
        FileAppClass entity = Convert.convert(FileAppClass.class, vo);
        fileAppClassService.save(entity);
        //将主键设置回vo使操作日志可以取到
        vo.setAppClassId(entity.getAppClassId());
        fileClearCacheUtil.clearFileClassInfo(entity.getFileClassCode(),entity.getAppId());
        return vo;
    }

    @Override
    @OpApi(funcCode = "fileAppClass0005", title = "文件应用分类授权管理修改", funcType = FuncTypeEnum.update)
    @SaveOplog(
            operationType = "fileAppClass0005",
            operationName = "文件应用分类授权管理修改",
            dataType = "appClassId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public FileAppClassVO edit(FileAppClassVO vo) {
        if (ObjectUtils.isEmpty(vo.getAppClassId())) {
            throw new AppException("传入需要修改的主键不能为空!");
        }
        FileAppClass oldEntity = fileAppClassService.getById(vo.getAppClassId());
        if (ObjectUtils.isEmpty(oldEntity)) {
            throw new AppException("查询不到需要修改的信息!");
        }
        //保存前校验
        checkSave(vo);
        //保存数据
        FileAppClass entity = Convert.convert(FileAppClass.class, vo);
        entity.setAuditName(SessionUtil.getUserId());
        entity.setAuditTime(new Date());
        fileAppClassService.updateById(entity);
        fileClearCacheUtil.clearFileClassInfo(entity.getFileClassCode(),entity.getAppId());
        return vo;
    }

    @Override
    @OpApi(funcCode = "fileAppClass0006", title = "文件应用分类授权管理根据主键删除", funcType = FuncTypeEnum.delete)
    @SaveOplog(
            operationType = "fileAppClass0006",
            operationName = "文件应用分类授权管理删除",
            dataType = "appClassId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public void del(FileAppClassKeyVO vo) {
        if (ObjectUtils.isEmpty(vo.getAppClassId())) {
            throw new AppException("传入需要删除的数据主键不能为空!");
        }
        FileAppClass entity = fileAppClassService.getById(vo.getAppClassId());
        if (ObjectUtils.isEmpty(entity)) {
            throw new AppException("未找到需要删除的信息!");
        }
        fileAppClassService.removeById(vo.getAppClassId());
        fileClearCacheUtil.clearFileClassInfo(entity.getFileClassCode(),entity.getAppId());
    }

    @Override
    @OpApi(funcCode = "fileAppClass0007", title = "文件应用分类授权批量新增", funcType = FuncTypeEnum.insert)
    @SaveOplog(
            operationType = "fileAppClass0007",
            operationName = "文件应用分类授权批量新增",
            dataType = "appClassId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public void addBatch(FileAppClassBatchVO vo) {
        if(CollectionUtils.isEmpty(vo.getFileAppClassVOS())){
            throw new AppException("没有需要授权的应用");
        }

        List<FileAppClassVO> fileAppClassVOList = vo.getFileAppClassVOS();

        for(FileAppClassVO fileAppClassVO:fileAppClassVOList){

            FileClass fileClass = fileClassService.getById(fileAppClassVO.getFileClassCode());
            if(ObjectUtils.isEmpty(fileClass)){
                throw new AppException("文件分类"+fileAppClassVO.getFileClassCode()+"不存在");
            }
            if(0L==fileAppClassVO.getExpireTime().getTime()||null==fileAppClassVO.getExpireTime()){
                Date expireTime =new Date(fileClass.getExpireTime());
                if(0L==expireTime.getTime()||null==expireTime){
                    Date date = new Date();
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(date);//设置起时间
                    cal.add(Calendar.YEAR, 1);//增加一年
                    expireTime = cal.getTime();
                    //如果分类有效时间为空则设置当前时间往后1年的时间戳
                    // 当前时刻的一年后时间戳
//                    long curTimeStamp = System.currentTimeMillis();
//                    expireTime = curTimeStamp + year;
                }
                fileAppClassVO.setExpireTime(expireTime);
            }
            //根据appId查询app文件分类已授权情况
            QueryWrapper<FileAppClass> queryWrapper=new QueryWrapper<>();
            queryWrapper.lambda().eq(FileAppClass::getAppId,fileAppClassVO.getAppId())
                    .eq(FileAppClass::getFileClassCode,fileAppClassVO.getFileClassCode());
            FileAppClass entity = fileAppClassService.getOne(queryWrapper);
            if(!ObjectUtils.isEmpty(entity)){
                //设置信息的过期时间
                entity.setExpireTime(fileAppClassVO.getExpireTime());
                fileAppClassService.updateById(entity);
                fileClearCacheUtil.clearFileClassInfo(entity.getFileClassCode(),entity.getAppId());
            }else{
                FileAppClass fileAppClass = new FileAppClass();
                fileAppClass.setAppId(Long.valueOf(fileAppClassVO.getAppId()));
                fileAppClass.setFileClassCode(fileAppClassVO.getFileClassCode());
                if(StringUtils.isEmpty(fileAppClassVO.getFileClassPath())){
                    fileAppClass.setFileClassPath("/"+fileAppClassVO.getAppId());
                }else{
                    fileAppClass.setFileClassPath(fileAppClassVO.getFileClassPath());
                }
                fileAppClass.setExpireTime(fileAppClassVO.getExpireTime());
                fileAppClassService.save(fileAppClass);
                fileClearCacheUtil.clearFileClassInfo(fileAppClass.getFileClassCode(),fileAppClass.getAppId());
            }

        }
    }

    @Override
    @OpApi(funcCode = "fileAppClass0008", title = "文件应用分类授权批量删除", funcType = FuncTypeEnum.delete)
    @SaveOplog(
            operationType = "fileAppClass0008",
            operationName = "文件应用分类授权批量删除",
            dataType = "appClassId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public void deleteBatch(FileAppClassBatchVO vo) {
        List<FileAppClassVO> fileAppClassVOS = vo.getFileAppClassVOS();
        for (FileAppClassVO fileAppClassVO:fileAppClassVOS){
            if(ObjectUtils.isEmpty(fileAppClassVO.getAppClassId())){
               QueryWrapper<FileAppClass> queryWrapper=new QueryWrapper<>();
               queryWrapper.lambda().eq(FileAppClass::getAppId,fileAppClassVO.getAppId())
                       .eq(FileAppClass::getFileClassCode,fileAppClassVO.getFileClassCode());
               fileAppClassService.remove(queryWrapper);
               fileClearCacheUtil.clearFileClassInfo(fileAppClassVO.getFileClassCode(),fileAppClassVO.getAppId());

            }else{
                FileAppClass fileAppClass=fileAppClassService.getById(fileAppClassVO.getAppClassId());

                fileAppClassService.removeById(fileAppClassVO.getAppClassId());
                if (fileAppClass!=null){
                    fileClearCacheUtil.clearFileClassInfo(fileAppClass.getFileClassCode(),fileAppClass.getAppId());
                }
            }
        }
    }

    @Override
    @OpApi(funcCode = "fileAppClass0009", title = "文件应用分类授权管理新增", funcType = FuncTypeEnum.insert)
    @SaveOplog(
            operationType = "fileAppClass0004",
            operationName = "文件应用分类授权管理新增",
            dataType = "appClassId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public void saveBatch(FileAppClassVO vo) {
        List<FileAppClass> entityList = new ArrayList<FileAppClass>();
        for(String fileClassCode : vo.getFileClassCodeList()) {
            vo.setFileClassCode(fileClassCode);
            //保存前校验
            checkSave(vo);
            //保存数据
            FileAppClass entity = Convert.convert(FileAppClass.class, vo);
            entityList.add(entity);

        }
        fileAppClassService.saveBatch(entityList);


    }

}
